/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Expressoes;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import analiseSintatica.estruturadados.ErroSintatico;
import analiseSintatica.estruturadados.NoArvore;

import java.util.LinkedList;

/**
 *
 * @author matheus
 */
public class RegraOpMultiplicacao extends Regra{


    protected static Regra instancia;

    protected String estrutura = "'*' | '/'";

    /**
     * Construtor privado necessario ao singleton
     */
    private RegraOpMultiplicacao() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraOpMultiplicacao getInstance() {
        if (instancia == null) {
            instancia = new RegraOpMultiplicacao();
        }
        return (RegraOpMultiplicacao) instancia;
    }

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {

        NoArvore naoterminaoOpMultiplicacao = new NoArvore("<op_multiplicacao>", false);

        if(listaTokens.getFirst().getLexema().equals("*")){
            naoterminaoOpMultiplicacao.adicionaFilho(reconhecerOpMultiplicacao(listaTokens));
        }else{
            naoterminaoOpMultiplicacao.adicionaFilho(reconhecerOpDivisao(listaTokens));

        }

        return naoterminaoOpMultiplicacao;
    }

    /**
     * Reconhece terminal "*"
     * @param tokens - Tokens do codigo
     * @return - Sub-arvore sintatica
     */
    public NoArvore reconhecerOpMultiplicacao(LinkedList<LinkToken> tokens) {
        tokens.removeFirst();
        return new NoArvore("*", true);
    }

    /**
     * Reconhece terminal "/"
     * @param tokens - Tokens do codigo
     * @return - Sub-arvore sintatica
     */
    public NoArvore reconhecerOpDivisao(LinkedList<LinkToken> tokens) {
        tokens.removeFirst();
        return new NoArvore("/", true);
    }

    @Override
    protected void setPrimeiro() {
        //P<op_multiplicacao> = {"*" , "/" }
        this.primeiro.add("*");
        this.primeiro.add("/");
    }

    @Override
    protected void setSeguinte() {
        // S<op_multiplicacao> = P<cast>
        seguinte.add("(");
        seguinte.add("{");
        seguinte.add("identificador");
        seguinte.add("numeroInteiro");
        seguinte.add("numeroFlutuante");
        seguinte.add("charconst");
        seguinte.add("++");
        seguinte.add("--");
        seguinte.add("&");
        seguinte.add("*");
    }

}
